home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene 96
/
Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso
/
misc
/
coding
/
vesacode
/
vesa.txt
< prev
Wrap
Text File
|
1996-01-28
|
11KB
|
297 lines
▀▀▀█ █▀▀█ █▀▀█ █ █▀▀▀ █ █ █▀▀▀ █▀▀▀ █▀▀█ ▀▀█▀▀ █ █ ▀▀█▀▀ █▀▀█ █▀▀█
▄▀▀ █▀▀█ █ █ ▀▀▀█ █ ▄▀ █▀ ▀▀▀█ █▀▀█ █ █ █ █ █ █ █▀█▀
▀▀▀▀ ▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀ ▀▀▀▀ ▀▀▀▀ ▀ ▀ ▀ ▀▀▀▀ ▀ ▀▀▀▀ ▀ ▀▀
███▀▀▀▀█▀██▀█▀██▀███▀▀▀▀███▀▀███▀▀▀▀█▀▀▀▀█▀██▀█████▀███▀▀▀▀███▀███▀▀▀▀█▀█▀▀███
███▄▀▀██ ▀▀ █ ██ ███▀▀▀ ███ █▄▀█ ▀███▀▀▀ █ ▀▀ █████ ███ ██ ███ ███ ██ █ ▀ ▀███
███▀▀▀ █ ▀▀ █ ▀▀ █ █ ▀▀▀███ ██ █ ▀▀▀█ ▀▀▀█ ▀▀ ███▀▀ ▀▀█ ██ █▀▀ ▀▀█ ▀▀ █ ▀▀ ███
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
1. Einleitung
Ich erkläre mich für nichts verantwortlich. Weder Schäden an Monitor,
Grafikkarte, CD-ROM, Joystick, Modem, HD-LED oder Gehirn können mir
angelastet werden.
Weiterhin verwende ich Markennamen ohne expliziten Hinweis.
Der Quellcode entstammt meinen Fingern. Deshalb behalte ich mir die Copyrights
vor. Anfragen auf Veröffentlichung usw. werden gern beantwortet.
Wer den Kurs ohne meine Zustimmung wesentlich verändert, muß mit Todesstrafe
rechnen. Jedoch darf der Quellcode verändert in Intros etc. mit Erwähnung
meines Namens (!) verwendet werden.
Zum Kurs gehören folgende Datenströme:
CUTZEROS.EXE CutZeros - Tool
CUTZEROS.PAS der Quellcode dazu
FILE_ID .DIZ kurze Beschreibung für Mailboxen
LIZARD .TXT Infos über uns selbst
SINUS .EXE Sinus - Tool
SINUS .PAS Quellcode dazu
VESA .ASM Assembler-Quellcode
VESA .COM das eigentliche Intro
VESA .TXT diese Datei
2. Die Grafik
2.1. VESA
2.1.1. Allgemeines
VESA ist in mehreren Revisionen auf dem Markt. Ganz alte Grafikkarten genügen
VESA 1.0, die Mehrheit VESA 1.2 und brandneu ist VESA 2.0. Das Programm selbst
begnügt sich mit VESA 1.0.
Die Schnittstelle ist der Interrupt 10h. Im AH-Register hat stets 4Fhex zu
stehen. War die auszuführende Funktion erfolgreich, steht in AH 0 und in
AL 4Fhex. Ist AH jedoch 1, trat ein Fehler auf. Hat AL einen Inhalt ungleich
4Fhex, so wird die Funktion erst gar nicht unterstützt.
Treten Probleme bei der Ausführung auf, so sollte man einen neueren VESA-
Treiber, z.B. UNIVBE probieren. Dies ist u.a. bei Cirrus-Logic-Karten der
Fall.
Im folgenden wird VESA nur kurz überflogen. Tiefer in die Materie geht die
c't 6/95, Seite 266ff und das Buch 'PC Intern' von Michael Tischer.
2.1.2. Initialisierung
Die Initialisierung erfolgt, indem zuerst die Existenz von VESA überprüft
wird. Ist dies erfolgreich, wird der Modus 101hex (640*480, 256 Farben)
getestet. War auch dies erfolgreich, werden benötigte Werte, wie der FAR-CALL-
Pointer und die Granularität ausgelesen. Ungültige oder nicht bearbeitbare
Situationen werden dabei auch überprüft.
Codeabschnitt: INITMODE
2.1.3. Punkte setzen
Ab Segment 0A000hex werden 64k des Bildschirmspeichers in den Hauptspeicher
eingeblendet. Modus 101hex benötigt aber 640*480=307200 Bytes.
Dieses Problem umgeht man mit Hilfe der 'Window'-Technik. Diese erlaubt,
unterschiedliche Teile des Bildschirmspeichers einzublenden.
Zuerst berechnet man den 32-Bit-Offset mit der Formel Y*MaxX+X, in unserem
Fall Y*640+X. Die unteren 16 Bit sind der Offset im eingeblendeten Speicher.
Die oberen 16 Bit übergibt man der FAR-CALL-Routine. Da diese aber immer noch
recht zeitaufwendig ist, wird mittels der Variablen VESASEG versucht, unnötige
Aufrufe zu vermeiden.
Codeabschnitte: SETWINDOW und PUTPIXEL
2.2. Zusätzliche Grafikoperationen
2.2.1. Palettenmanipulation
Das sanfte Ein- und Ausblenden wäre mit Setzen von Pixeln nicht zu reali-
sieren. Jedoch kommt uns hier die Palette zur Hilfe. Sie definiert für jeden
Pixelwert einen RGB-Wert (Rot-Grün-Blau). Wird dieser verändert, ändern sich
alle entsprechenden Pixel.
Wie der Name RGB schon andeutet, besteht der RGB-Wert aus 3 Byte. Sie sind
jedoch auf 6 Bit beschärnkt, d.h. auf Werte zwischen 0 und 63. Jedoch lassen
sich damit 2^(6+6+6)=262144 Farbtöne darstellen, theoretisch mehr, als das
menschliche Auge unterscheiden kann.
Beim Ein- bzw. Ausblenden (Fading) wird folgende Technik verwendet:
Eine Schleife, die 64 mal durchlaufen wird, setzt jeden RGB-Wert neu. Davon
wird jeder Einzelwert wiederum (R, G, B) nach dieser Formel berechnet:
neuer Wert = Originalwert * Schleifendurchlauf / 64
Dabei darf der Originalwert nicht verändert werden.
Anschließend wird die Palette gesetzt, d.h. der Grafikkarte mitgeteilt.
Der DAC-Port, der für die Palette verantwortlich ist, befindet sich an 3C7hex
bis 3C9hex. Dabei ist 3C9hex für die Daten verantwortlich. An 3C7hex wird der
Pixelwert übergeben, für den in 3C9hex die RGB-Werte geschrieben werden. Für
3C8hex gilt das gleiche, nur für Lesezugriffe.
Codeabschnitte: SAVEPALETTE, SETPALETTE, PALBLACK, FADEIN, FADEOUT
2.2.2. Linien
Das Programm enthält zwei Linienalgorithmen, einer für horizontale und einer
für vertikale Linien. Beliebige Linien werden nicht benötigt, eine ent-
sprechende Implementation war deshalb auch nicht nötig. Wen es trotzdem
interessiert, der lese Artikel über den Bresenham-Algorithmus.
Horizontale Linien:
Horizontale Linien werden beim Programmstart gebraucht und müssen deshalb
schnell gezeichnet werden. Also wird in 2 Fälle unterschieden:
a. Die Linie verteilt sich auf 2 'Windows'.
b. Die Linie liegt innerhalb eines 'Windows'.
Fall b tritt wesentlich häufiger auf, Fall a ist ein ärgerliches Beiwerk.
So wird Fall b mit schnellen Prozessorbefehlen bearbeitet, Fall a setzt
sich aus einer Schleife zusammen, die PUTPIXEL-ähnlich arbeitet.
Vertikale Linien:
Vertikale Linien werden kaum gebraucht und werden deshalb (langsam) auf
PUTPIXEL-ähnliche Weise gezeichnet.
Codeabschnitte: XLINE, YLINE
3. Die Mathematik
3.1. 3D-Theorie
Das Sternenfeld besteht aus einzelnen Punkten, die mittels ihrer X-,Y- und
Z-Koordinate spezifiziert sind. Alle 3 Werte liegen im Bereich -63 bis +63.
Einzige verwendete mathematische Manipulation ist die Rotation. Sie erfolgt,
indem zwei der drei Koordinaten wie in 2D mit Sinus und Cosinus um einen
Mittelpunkt gedreht werden:
a' = a*cos(alpha) - b*sin(alpha)
b' = a*sin(alpha) + b*sin(alpha)
Für a und b werden X, Y und Z in allen Kombinationen eingesetzt. Entsprechend
wird alpha mit dem jeweiligen Winkel gesetzt. Dies ist zwar mathematisch voll
daneben geggriffen, genügt aber den Ansprüchen.
Codeabschnitte: ROTATE, Teile von SHOWPOINTS
3.2. Transformation nach 2D
Leider ist damit noch nicht die gesamte Arbeit geleistet. Der Monitor ist nur
2-dimensional. Dieses Problem wird mit Hilfe des Strahlensatzes gelöst. Die
entsprechenden Formeln sind:
2D-x = (x*i)/z
2D-y = (y*i)/z
Dabei ist i der Abstand Mensch-Monitor und wird willkürlich mit 128 gewählt,
da dies durch Bitverschiebung bewältigt werden kann. Außerdem wird Z um 200
erhöht, da sonst das Sternenfeld nur teilweise sichtbar wäre.
Codeabschnitt: CONV3D
4. Sonstige Operationen
4.1. 386er-Test
Im Quellcode werden nicht wenige 386-spezifische Befehle verwendet. Deshalb
muß seine Existenz überprüft werden, um INT6 und Abstürze auf 286er etc. zu
verhindern.
Das Prinzip ist, zu überprüfen, ob die Flagbits 13 bis 16 verändert werden
können. Bis einschließlich 286er war dies nicht möglich.
Codeabschnitt: CHECK386
4.2. Digitalschrift
Die einzelnen Segmente der Digitalschrift werden nach folgendem Schema
organisiert:
111111
4 5
4 5
4 5
222222
6 7
6 7
6 7
333333
Im Programm werden die einzelnen Segmente binär codiert. So sieht die
Codierung der 5 wie folgt aus:
Bit 7 6 5 4 3 2 1 0
0 1 0 0 1 1 1 1
Durch Bitoperatoren werden die einzelnen Bits herausgefiltert und geprüft.
Codeabschnitte: DIGITALCHAR, DIGITALTEXT
4.3. Zufallsgenerator
Das Sternenfeld wird per Zufallsgenerator erzeugt. Dieser ist extrem simpel
und erhebt keinen Anspruch auf Genauigkeit. Das Prinzip ähnelt sehr stark der
RANDOM-Funktion aus der Runtime Library von Borland Pascal 7.0. Deshalb will
ich hier keinerlei Ansprüche auf eigene Kreativität erheben.
Der Zufallsgenerator wird nicht initialisiert und erzeugt deswegen immer die
gleichen Zahlen.
Codeabschnitt: RANDOM
4.4. Daten initialisieren
Da ein relativ großer Datenoverhead vorhanden ist, der aber nur Nullen ent-
hält, wurde dieser nachträglich entfernt. (siehe 5.)
Bei Programmstart ist dieser Bereich zwischen STARTOFZEROS und ENDOFZEROS in
einem undefiniertem Zustand. Also wird er vorsichtshalber mit Nullen be-
schrieben.
Dann wird das Sternenfeld per Zufall generiert und die Palette aufgebaut.
Aus dem 1. Quadranten der Sinusfunktion wird der Cosinus des 1.Quadranten
berechnet. Aus diesem werden dann die 2., 3. und 4.Quadranten aufgebaut. Da
Sinus und Cosinus mathematisch um 90 Grad verschoben sind, macht sich das
Programm diese Eigenschaft in Form einer Speicherüberlappung zunutze.
Codeabschnitt: CLEARDATA, INITDATA
5. Tools
Neben den VESA-Files sind auch noch zwei kleine Hilfsprogramme dem Kurs
beigelegt. Beide sind nicht dokumentiert, aber trotzdem leicht verständlich.
Im einzelnen handelt es sich um:
SINUS.EXE:
Dieses Programm berechnet lediglich im Assembler-konformen Format eine Sinus-
tabelle im Bereich -127..+127
CUTZEROS.EXE:
Die Dateigröße konnte mit CUTZEROS.PAS wesentlich verkürzt werden. Dabei
machte ich mir die Eigenschaft zunutze, daß alle Daten am Dateiende nur Nullen
enthalten. Diese werden abgeschnitten und zur Laufzeit erst belegt. Wer also
VESA.ASM neu compiliert, wird eine Dateigröße von 8839 Bytes feststellen. Nach
Programmlauf von CUTZEROS bleiben nur noch 1689 Bytes übrig. Dies entspricht
etwa 19% der Ursprungsgröße. Bei dieser Größe versagten dann auch alle mir
verfügbaren EXE- bzw. COM-Komprimierer.
6. Anhang
Natürlich sind alle Möglichkeiten noch lange nicht ausgereizt. So fehlt
Musik, ein netter Scrolly und vieles mehr. Doch dies alles würde diesen Kurs
ausufern lassen.
Zur Zeit besteht das Sternenfeld aus 300 Sternen. Allerdings werden auch noch
900 Sterne flüssig angezeigt (486DX40).
Für meine Arbeit habe ich als äußerst empfehlenswert empfunden:
∙ PC Intern 3.0 von Michael Tischer
∙ c't 6/95, Seite 266ff
∙ Das Assemblerbuch von Trutz Eyke Podschun
7. Der Autor
Stephan "ZAN" Brumme kommt aus Luckenwalde bei Berlin, ist 17 und baut
gerade sein Abi. Wenn er nicht programmiert ( Turbo Assembler 3.2, Borland
Pascal 7.0 ) dann hört er Musik ( Smashing Pumpkins... ) oder spielt
Basketball.
Bugreports, Vorschläge usw. bitte in Ghost BBS posten.
Ciao.